package multithreading.apsOrdenacao;


/**
 * @author fabricio@utfpr.edu.br
 */
public class OrdenaVetores {

    private int[] vet;
    private long tempoi = 0;
    private long tempof = 0;

    public OrdenaVetores(int tamanho) {
        vet = new int[tamanho];
    }

    public void InicializaTempo() {
        if (tempoi == 0) {
            tempoi = System.currentTimeMillis();
            //System.out.println("Tempo inicial: "+getTempoi());
        }
    }

    public void FinalizaTempo() {
        if (tempof < System.currentTimeMillis()) {
            tempof = System.currentTimeMillis();
            System.out.println("Tempo Total: " + (tempof - tempoi));
        }
    }

    /* BOLHA    
    ------------------------------------------------*/
    public boolean Bolha() {
        InicializaTempo();
        System.out.println("Bolha em acao!");
        int t, a, b;

        boolean isSorted = false;
        for (a = 1; a < getVet().length; a++) {
            for (b = getVet().length - 1; b >= a; b--) {
                if (getVet()[b - 1] > getVet()[b]) {
                    t = getVet()[b];
                    getVet()[b] = getVet()[b - 1];
                    getVet()[b - 1] = t;
                    isSorted = true;
                }
            }
        }
        FinalizaTempo();
        //System.out.println("Fim Bolha!");

        return isSorted;
    }

    /* SELECAO DIRETA    
    ------------------------------------------------*/
    public boolean SelecaoDireta() {
        InicializaTempo();
        System.out.println("SD em acao!");
        int t = 0, flag = 0;
        int a = 0, b = 0, c = 0;
        boolean isSorted = false;

        for (a = 0; a < getVet().length - 1; ++a) {
            flag = 0;
            c = a;
            t = getVet()[a];

            for (b = a + 1; b < getVet().length; ++b) {
                if (getVet()[b] < t) {
                    c = b;
                    t = getVet()[b];
                    flag = 1;
                }
            }
            if (flag == 1) {
                getVet()[c] = getVet()[a];
                getVet()[a] = t;
                isSorted = true;
            }
        }
        FinalizaTempo();

        //System.out.println("Fim SD!");
        return isSorted;
    }

    /* INSERCAO DIRETA    
    ------------------------------------------------*/
    public boolean InsercaoDireta() {
        InicializaTempo();

        System.out.println("IS em acao!");
        int t;
        int a, b;
        boolean isSorted = false;

        for (a = 1; a < getVet().length; ++a) {
            t = getVet()[a];
            for (b = a - 1; b >= 0 && t < getVet()[b]; b--) {
                getVet()[b + 1] = getVet()[b];
                isSorted = true;
            }
            getVet()[b + 1] = t;
        }
        FinalizaTempo();

        //System.out.println("Fim IS!");
        return isSorted;
    }

    public void Sorteia() {
        System.out.println("Sorteia em acao!");
        for (int i = 0; i < getVet().length; i++) {
            getVet()[i] = (int) (Math.random() * 100);
        }
    }

    /**
     * @return the vet
     */
    public int[] getVet() {
        return vet;
    }

    /**
     * @param vet the vet to set
     */
    public void setVet(int[] vet) {
        this.vet = vet;
    }

    /**
     * @return the tempoi
     */
    public long getTempoi() {
        return tempoi;
    }

    /**
     * @param tempoi the tempoi to set
     */
    public void setTempoi(long tempoi) {
        this.tempoi = tempoi;
    }

    /**
     * @return the tempof
     */
    public long getTempof() {
        return tempof;
    }

    /**
     * @param tempof the tempof to set
     */
    public void setTempof(long tempof) {
        this.tempof = tempof;
    }
}